Promise 是用來處理非同步行為,最常拿來處理 AJAX 的行為,其他非同步行為也很適合。
// 使用兩個外部套件 1. jQuery 2. axios(基於 Promise 遠端請求工具)
const url = 'https://randomuser.me/api/' // 對此網址發出請求,回傳JOSN
// 方式一
$.ajax({
url: url,
}).done(function (res) {
console.log(res);
});
// 方式二 (randomuser.me網站提供的方式,結果跟方式一同)
$.ajax({
url:'https: // randomuser.me/api/'
dataType: 'json',
success: function (data) {
console.log(data);
}
});
const url = 'https://randomuser.me/api/'
let data = {}; // 建立 data 空物件
$.ajax({
url: url,
}).done(function (res) {
console.log(res);
data = res.results;
});
console.log(data); // 此時 data 出來結果是空物件
$.ajax({
url: url,
}).done(function (res) {
// console.log(res);
data = res.results;
console.log(res); // 放入 done 裡面
});
試著抓兩筆資料,一筆隨機資料,一筆特定資料(利用 randomuser.me 網站提供 seed 的方式)
$.ajax({
url: url,
}).done(function (res) {
const seed = res.info.seed;
console.log(seed, res);
$.ajax({
url: `${ url }?seed-${ seed}`, // 利用樣板字面值,在 url 放入特定 seed
}).done(function (res2) {
console.log(res2);
});
});
解決寫法不一致,promise 的 axios 有固定結構寫法
axios.get(url) // 使用 get 來取得遠端資料
.then((res) => { // 連接都用 .then 來開始串接
console.log(res)
})
解決回呼地獄,使用串接語法
axios.get(url)
.then((res) => {
console.log(1, res) // 輸出第一次
const seed = res.data.info.seed; // 將 seed 方法定義在 data 裡面
return axios.get('$furl]?seed-$fseed ') // 回傳呼叫第二次
})
.then((res) {
console.log(2, res) // 輸出第二次
})
解決無法同時執行,使用 promise.all 陣列方式來同時多個請求。
promise.all([axios.get(url), axios.get(url)])
.then(([res, res2])) => {
console.log(res1, res2)
})